package com.kgc.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.kgc.api.buylimit.SnapupApi;
import com.kgc.bean.BuyLimitActivity;
import com.kgc.bean.BuyLimitItem;
import com.kgc.config.BuyLimitConfig;
import com.kgc.service.SnapupService;
import com.kgc.util.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import springfox.documentation.spring.web.json.Json;

import java.io.IOException;
import java.util.*;

/**
 * @Author：周申宇 <p>
 * @Date:2021/6/21 10:47
 * <p>
 * @Decription: 抢购业务的实现
 */
@Service
@Slf4j
public class SnapupServiceImpl implements SnapupService {

    @Autowired
    private RedisUtils redisUtils;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Reference(timeout = 30000)
    private SnapupApi snapupApi;

    @Autowired
    private BuyLimitConfig buyLimitConfig;

    @Override
    public boolean addPresale(Integer activyId) {
        boolean flag = false;

        // 如果redis中没有，先把数据放到redis中
        if (null == redisUtils.get(String.valueOf(activyId))) {
            // 把数据库中的数据同步到redis中 抢购活动表数据，抢购活动商品
            BuyLimitActivity buyLimitActivity = snapupApi.selectActivityById(activyId);
            List<BuyLimitItem> buyLimitItemList = snapupApi.selectActivityItemsByActivityId(activyId);

            // 把活动放到redis中
            String blaStr = JSON.toJSONString(buyLimitActivity);
            redisUtils.set(String.valueOf(activyId), blaStr, 7200);

            // 把活动的存储在 set 中 ，方便定时任务的查询,发送手机号
            redisTemplate.opsForSet().add("schedual", activyId);


            // 把本次的活动商品一一放到redis中
            buyLimitItemList.forEach(buyLimitItem -> {
                // 活动商品需要加前缀 prod-stock-num- ,key：商品id，value：商品数量
                redisUtils.set(String.valueOf(buyLimitConfig.getStockNumPrefix() + buyLimitItem.getGoodsId()), buyLimitItem.getNum(), 7200);
            });

            // 把商品的list放到redis中，方便展示方法showPresale（）的返回
            String blilStr = JSON.toJSONString(buyLimitItemList);
            redisUtils.set("buyLimitItemList" + activyId, blilStr, 7200);
            flag = true;
        }
        return flag;
    }

    @Override
    public Map<String, Object> showPresale(Integer activyId) throws IOException, ClassNotFoundException {

        // 把数据封装到map中展示
        Map<String, Object> map = new HashMap<>();
        // 如果redis中没有，先把数据放到redis中
        if (null == redisUtils.get(String.valueOf(activyId))) {
            map.put("buyLimitActivity", "请先抢购预热");
            map.put("flag", false);
            return map;
        }

        BuyLimitActivity buyLimitActivity = JSON.parseObject(redisUtils.get(String.valueOf(activyId)).toString(), BuyLimitActivity.class);
        log.info("{}", buyLimitActivity);
        // map.put("buyLimitActivity", redisUtils.get(String.valueOf(activyId)));
        map.put("buyLimitActivity", buyLimitActivity);
        map.put("buyLimitItemList", redisUtils.get("buyLimitItemList" + activyId));
        map.put("flag", true);
        return map;
    }

    @Override
    public boolean addRegUser(String userId, String activyId) {

        ArrayList<String> userIdList = new ArrayList<>();

        if (null == redisUtils.get(String.valueOf(activyId))) {
            return false;
        }
        // 如果 redis 中没有，list 可以直接添加
        if (null == redisUtils.get("user-" + activyId)) {
            userIdList.add(userId);
            // 存入redis中key ：固定值（User字符串）- + activityId
            redisUtils.set("user-" + activyId, JSON.toJSONString(userIdList), 7200);
            return true;
        }
        // 当redis中存在，需要先把添加本次活动的用户拿出来
        ArrayList<String> userIds = (ArrayList<String>) JSON.parseArray(redisUtils.get("user-" + activyId).toString(), String.class);
        // 当redis中的 list 存在用户 id ，代表用户已经添加了本次抢购活动
        if (userIds.contains(userId)) {
            return false;
        }
        // 当用户没有添加时，把用户 id ，放到 list 中
        userIds.add(userId);
        redisUtils.set("user-" + activyId, JSON.toJSONString(userIds));
        return true;
    }


}
